package middleware

import (
	"fmt"
	"oc_saas/enum/response"
	"oc_saas/utils/tool"
	"runtime"

	"github.com/gin-gonic/gin"
)

// 自定义错误处理

func CustomRecovery() gin.HandlerFunc {
	return func(c *gin.Context) {
		defer func() {
			if err := recover(); err != nil {
				stack := stack(3)
				tool.FailWithMessage(response.OPERA_FAIL, tool.Enum{
					Class: stack,
					Error: fmt.Sprintf("%v", err),
				}, c)
			}
		}()
		c.Next()
	}
}

func stack(skip int) []string {
	// buf := new(bytes.Buffer) // the returned data
	// pc, file, line, ok := runtime.Caller(skip)
	// if ok {
	// 	fmt.Fprintf(buf, "%s:%d (0x%x)", file, line, pc)
	// } else {
	// 	return []byte{}
	// }
	// As we loop, we open files and read them. These variables record the currently
	// loaded file.
	// var lines [][]byte
	// var lastFile string
	var errStr []string
	for i := skip; ; i++ { // Skip the expected number of frames
		pc, file, line, ok := runtime.Caller(i)
		if !ok {
			break
		}
		// Print this much at least.  If we can't find the source, it won't show.
		// fmt.Fprintf(buf, "%s:%d (0x%x)\n", file, line, pc)
		errStr = append(errStr, fmt.Sprintf("%s:%d (0x%x)\n", file, line, pc))
		// if file != lastFile {
		// 	// data, err := os.ReadFile(file)
		// 	// if err != nil {
		// 	// 	continue
		// 	// }
		// 	// lines = bytes.Split(data, []byte{'\n'})
		// 	lastFile = file
		// }
		// fmt.Fprintf(buf, "\t%s: %s\n", function(pc), source(lines, line))
	}
	return errStr
}
